home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
games
/
spassion
/
source.lzh
/
SOURCE
/
FuncEnemy
/
CRYSTAL.C
< prev
next >
Wrap
Text File
|
2000-03-21
|
8KB
|
329 lines
/*
#include <stdio.h>
#include <iocslib.h>
void key_wait( void );
#define BIT(i) (1<<(i))
*/
/*
クリスタル
*/
#include <xsp2lib.h>
#include "../SPASSION.H"
#include "../player.h"
#include "../enemy.h"
#include "../eshot.h"
#include "../effect.h"
#include "../priority.h"
#include "../sound.h"
#include "../entry.h"
#ifndef NULL
#define NULL ((void *) 0)
#endif
#define PALET_MAIN 0x0600
static short MoveEnemyCrystal_L( ENEMY *ene );
/*static void TiniEnemyCrystal_L(ENEMY *);*/
static short MoveEnemyCrystal_M( ENEMY *ene );
/*static void TiniEnemyCrystal_M(ENEMY *);*/
static short MoveEnemyCrystal(ENEMY *);
/*static void TiniEnemyCrystal(ENEMY *);*/
#define PT_ST_L 0x00
#define PT_END_L 0x02
#define PT_ST 0x10
#define PT_END 0x12
static HIT_XY4 hitl_p[]={-12-PLAYER_HIT_X,-12-PLAYER_HIT_Y,12+PLAYER_HIT_X,12+PLAYER_HIT_Y};
static HIT_XY4 hitl_o[]={-12-OPTION_HIT_X,-12-OPTION_HIT_Y,12+OPTION_HIT_X,12+OPTION_HIT_Y};
static HIT_XY4 hitl_s[]={-12,-12,12,12};
static HIT_XY4 hitm_p[]={-12-PLAYER_HIT_X,-12-PLAYER_HIT_Y,12+PLAYER_HIT_X,12+PLAYER_HIT_Y};
static HIT_XY4 hitm_o[]={-12-OPTION_HIT_X,-12-OPTION_HIT_Y,12+OPTION_HIT_X,12+OPTION_HIT_Y};
static HIT_XY4 hitm_s[]={-12,-12,12,12};
/* 16x16キャラの当たり判定 */
extern HIT_XY4 hit8_p;
extern HIT_XY4 hit8_o;
extern HIT_XY4 hit8_s;
static unsigned char seed=0;
void InitEnemyCrystal_LHit( void )
{
}
void InitEnemyCrystal_MHit( void )
{
}
/* InitEnemyZako00Hitと同じなのでいらない */
void InitEnemyCrystalHit( void )
{
}
void InitEnemyCrystal_L(ENEMY *ene)
{
ene->info = PALET_MAIN | PRIORITY_ZAKO;
ene->vx = (ene->arg>>8 ) * 32768; /* 引数の上位バイトをvxにする */
ene->vy = ((char)(ene->arg&0xFF)) * 32768; /* 引数の下位バイトをvyにする */
ene->hit_p[0] = &hitl_p[0];ene->hit_p[1]=NULL;
ene->hit_o[0] = &hitl_o[0];ene->hit_o[1]=NULL;
ene->hit_s[0] = &hitl_s[0];ene->hit_s[1]=NULL;
ene->hp = 20;
ene->no_dead = 0;
ene->func_enemy_move = MoveEnemyCrystal_L;
/* ene->func_enemy_tini = TiniEnemyCrystal_L;*/
/* entry_counter_stop = !0;*/ /* エントリーカウンター停止 */
}
void InitEnemyCrystal_M(ENEMY *ene)
{
/* 分裂前より速度を落とす */
if( ene->parent->vx>>16 > (ene->vx = -(rndtable[seed++] & 0x7)) )
ene->vx=ene->parent->vx;
else
ene->vx *= 32768;
seed&=255;
if( ene->parent->vy>>16 > (ene->vy = -(rndtable[seed++] & 0x3)) )
ene->vy=ene->parent->vy;
else
ene->vy *= 32768;
seed&=255;
if( rndtable[seed++]>127 )
ene->vy *= -1;
seed&=255;
if( ene->vx > 0 )
ene->vx *= -1;
if( !ene->vx && !ene->vy )
ene->vx = -65536/4;
/*printf("vx=%d vy=%d vx=%d vy=%d\n",ene->vx,ene->vy,ene->vx>>16,ene->vy>>16);
key_wait();
*/
ene->info = PALET_MAIN | PRIORITY_ZAKO;
ene->hit_p[0] = &hitm_p[0];ene->hit_p[1]=NULL;
ene->hit_o[0] = &hitm_o[0];ene->hit_o[1]=NULL;
ene->hit_s[0] = &hitm_s[0];ene->hit_s[1]=NULL;
ene->hp = 10;
ene->no_dead = 0;
ene->func_enemy_move = MoveEnemyCrystal_M;
/* ene->func_enemy_tini = TiniEnemyCrystal_M;*/
/* entry_counter_stop = !0;*/ /* エントリーカウンター停止 */
}
void InitEnemyCrystal(ENEMY *ene)
{
/* 分裂前より速度を落とす */
if( ene->parent->vx>>16 > (ene->vx = -(rndtable[seed++] & 0x7)) )
ene->vx=ene->parent->vx;
else
ene->vx *= 32768;
seed&=255;
if( ene->parent->vy>>16 > (ene->vy = -(rndtable[seed++] & 0x3)) )
ene->vy=ene->parent->vy;
else
ene->vy *= 32768;
seed&=255;
if( rndtable[seed++]>127 )
ene->vy *= -1;
seed&=255;
if( ene->vx > 0 )
ene->vx *= -1;
if( !ene->vx && !ene->vy )
ene->vx = -65536/4;
ene->info = PALET_MAIN | PRIORITY_ZAKO;
ene->hit_p[0] = &hit8_p;ene->hit_p[1]=NULL;
ene->hit_o[0] = &hit8_o;ene->hit_o[1]=NULL;
ene->hit_s[0] = &hit8_s;ene->hit_s[1]=NULL;
ene->hp = 5;
ene->no_dead = 0;
ene->func_enemy_move = MoveEnemyCrystal;
/* ene->func_enemy_tini = TiniEnemyCrystal;*/
/* entry_counter_stop = !0;*/ /* エントリーカウンター停止 */
}
static short MoveEnemyCrystal_L( ENEMY *ene )
{
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
ene->x = ((ene->lx += ene->vx) >> 16);
ene->y = ((ene->ly += ene->vy) >> 16);
ene->pt = obj_obj_b+PT_ST_L+(ene->anim_count++)/8;
if( ene->pt > obj_obj_b+PT_END_L ){
ene->pt = obj_obj_b+PT_ST_L;
ene->anim_count=0;
}
#if 0
if(ENE_X < 128){
ene->lx = 192*65536;
ene->ly = 192*65536;
ene->vx = 0;
ene->vy = 0;
}
if( BITSNS(0x04) & BIT(1) ){
while( BITSNS(0x04) & BIT(1) );
entry_counter_stop = 0;
return (0);
}
#endif
/* 画面外に出たら消去 */
if( ENE_X < 16 - 16 )
return (0);
/* ダメージを受けた時の処理 */
#if 1
if(ene->damage){
SetSE(SE_DAMAGE); /* 効果音 */
ene->info = PALET_DAMAGE | PRIORITY_BOSS; /*パレット変更*/
if((ene->hp -= ene->damage) <= 0) {
SetSE(SE_EXPL_CRYSTAL); /* 爆発音 */
ene->player->score += 5;
MakeEnemy(ENEMY_CRYSTAL_M , ene->x , ene->y, 0, ene); /* クリスタル(中)生成 */
MakeEnemy(ENEMY_CRYSTAL_M , ene->x , ene->y, 0, ene); /* クリスタル(中)生成 */
return (0); /* 消去 */
}
ene->damage = 0;
}else
ene->info = PALET_MAIN | PRIORITY_ZAKO;
#endif
xobj_set_st(ene);
return(1);
}
static short MoveEnemyCrystal_M( ENEMY *ene )
{
short st=5,end=6;
int vx=0,vy=0;
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
ene->x = ((ene->lx += ene->vx) >> 16);
ene->y = ((ene->ly += ene->vy) >> 16);
if( ene->vx < 0 )
vx = ene->vx*-1;
if( ene->vy < 0 )
vy = ene->vy*-1;
/*printf("0 st=%d,end=%d \n",st,end);*/
if( vx > vy ){
st=5;end=6;
}else{
st=3;end=4;
}
ene->pt = obj_obj_b+st+(ene->anim_count++)/8;
if( ene->pt > obj_obj_b+end ){
ene->pt = obj_obj_b+st;
ene->anim_count=0;
}
/*
printf("1 st=%d,end=%d \n",st,end);
key_wait();
*/
#if 0
if(ENE_X < 128){
ene->lx = 128*65536;
ene->ly = 192*65536;
ene->vx = 0;
ene->vy = 0;
}
if( BITSNS(0x04) & BIT(1) ){
while( BITSNS(0x04) & BIT(1) );
entry_counter_stop = 0;
return (0);
}
#endif
/* 画面外に出たら消去 */
if( ENE_X < 16 - 16 )
return (0);
/* ダメージを受けた時の処理 */
#if 1
if(ene->damage){
SetSE(SE_DAMAGE); /* 効果音 */
ene->info = PALET_DAMAGE | PRIORITY_BOSS; /*パレット変更*/
if((ene->hp -= ene->damage) <= 0) {
SetSE(SE_EXPL_CRYSTAL); /* 爆発音 */
ene->player->score += 3;
MakeEnemy(ENEMY_CRYSTAL , ene->x , ene->y, 0, ene); /* クリスタル(小)生成 */
MakeEnemy(ENEMY_CRYSTAL , ene->x , ene->y, 0, ene); /* クリスタル(小)生成 */
return (0); /* 消去 */
}
ene->damage = 0;
}else
ene->info = PALET_MAIN | PRIORITY_ZAKO;
#endif
xobj_set_st(ene);
return(1);
}
static short MoveEnemyCrystal( ENEMY *ene )
{
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
ene->x = ((ene->lx += ene->vx) >> 16)-8; /*-8は表示位置をずらすため*/
ene->y = ((ene->ly += ene->vy) >> 16)-8;
ene->pt = obj_obj+PT_ST+(ene->anim_count++)/8;
if( ene->pt > obj_obj+PT_END ){
ene->pt = obj_obj+PT_ST;
ene->anim_count=0;
}
#if 0
if(ENE_X < 128){
ene->lx = 64*65536;
ene->ly = 192*65536;
ene->vx = 0;
ene->vy = 0;
}
if( BITSNS(0x04) & BIT(1) ){
while( BITSNS(0x04) & BIT(1) );
entry_counter_stop = 0;
return (0);
}
#endif
/* 画面外に出たら消去 */
if( ENE_X < 16 - 8 )
return (0);
/* ダメージを受けた時の処理 */
#if 1
if(ene->damage){
SetSE(SE_DAMAGE); /* 効果音 */
ene->info = PALET_DAMAGE | PRIORITY_BOSS; /*パレット変更*/
if((ene->hp -= ene->damage) <= 0) {
SetSE(SE_EXPL_CRYSTAL_S); /* 爆発音 */
ene->player->score += 1;
return (0); /* 消去 */
}
ene->damage = 0;
}else
ene->info = PALET_MAIN | PRIORITY_ZAKO;
#endif
xsp_set_st(ene);
return(1);
}
/*
static void TiniEnemyCrystal(ENEMY * p)
{
}
*/